﻿// BoostTCPServer.cpp: 定义应用程序的入口点。
//

#include "BoostTCPServer.h"

using namespace std;

TcpServer::TcpServer(boost::asio::io_context& io_context, int port)
	: acceptor(io_context, tcp::endpoint(tcp::v4(), port)),
	socket(io_context),
	timer(io_context) {
	startAccept();
}

void TcpServer::startAccept()
{
	acceptor.async_accept(socket, [this](const boost::system::error_code& ec)
		{
			if (!ec)
			{
				std::cout << "client connected" << std::endl;
				startRead();
				startHeartbeatTimer(); // 启动心跳定时器
			}
			else
			{
				std::cerr << "Accept error: " << ec.message() << std::endl;
			}
		});
}

void TcpServer::startRead()
{
    boost::asio::async_read_until(socket, receiveBuffer, '\n',
        [this](const boost::system::error_code& ec, std::size_t bytes_transferred) {
            if (!ec) {
                std::istream is(&receiveBuffer);
                std::string message;
                std::getline(is, message);

                // 处理收到的数据（可以根据实际需求进行处理）
                std::cout << "server received message: " << message << std::endl;
                if (message.compare("heartbeat") == 0) {
                    resetHeartbeatTimer(); // 收到心跳数据包时重置定时器
                }

                startRead(); // 继续读取下一条数据
            }
            else {
                std::cerr << "server read error: " << ec.message() << std::endl;
                startAccept(); // 重新启动接受连接操作
            }
        });
}

void TcpServer::resetHeartbeatTimer()
{
    std::cout << "resetHeartbeatTimer" << std::endl;
    timer.cancel(); // 取消当前定时器
    timer.expires_after(std::chrono::seconds(10)); // 设置新的定时器超时时间为10秒
    timer.async_wait(
        [this](const boost::system::error_code& ec) {
            if (!ec) {
                std::cerr << "Heartbeat timeout0, reconnecting..." << std::endl;
                socket.close(); // 关闭当前连接
                startAccept(); // 重新启动接受连接操作
            }
        });
}

void TcpServer::startHeartbeatTimer() 
{
	timer.expires_after(std::chrono::seconds(10)); // 设置定时器超时时间为10秒
	timer.async_wait(
		[this](const boost::system::error_code& ec) {
			if (!ec) {
				std::cerr << "Heartbeat timeout1, reconnecting..." << std::endl;
				socket.close(); // 关闭当前连接
				startAccept(); // 重新启动接受连接操作
			}
		});
}